<?php
namespace lib;

class App{

    /**
     * 加载依赖
     */
    protected static function rely(){
        //加载配置文件
        if(is_file(APP_PATH . 'config' . EXT)){
            Conf::load(APP_PATH . 'config' . EXT);
        }
        //加载公共文件
        if(is_file(APP_PATH . 'common' . EXT)){
            include APP_PATH . 'common' . EXT;
        }
    }

    /**
     * 路由
     * @param Request $request
     * @throws \Exception
     */
    public static function route(Request $request){

        //加载依赖文件
        self::rely();

        list($module, $controller, $action) = $request->route;
        $controller = ucwords($controller);

        define('MODULE_NAME', $module);
        define('ACTION_NAME', $action);
        define('CONTROLLER_NAME', $controller);
        define('MODEL_PATH', APP_PATH . MODULE_NAME . DS . 'model' . DS);
        define('VIEW_PATH', APP_PATH . MODULE_NAME . DS . 'view' . DS);

        //注册模型的命名空间
        Autoload::register(['model'=>MODEL_PATH]);

        $class = strtolower("app\\{$module}\\controller\\") . $controller;
        try{
            $obj = new $class($request);
            if(method_exists($obj, $action)){
                Response::send(call_user_func([$obj, $action]));
            }else{
                Exception::exception("调用未定义方法[{$action}]");
            }
        }catch (\Exception $e){
            Exception::exception($e->getMessage());
        }
    }

    /**
     * 走你!
     * @throws \Exception
     */
    public static function run(){
        Session::start();
//        date_default_timezone_set('PRC');
        // 注册错误和异常处理机制
//        register_shutdown_function('\lib\Exception::shutdown');
//        set_exception_handler('\lib\Exception::ExceptionHandler');        //自定义异常处理
//        set_error_handler('\lib\Exception::ErrorHandler');        //自定义错误处理
        self::route(new Request());
    }

}